package com.panghl.starter.config;

import com.panghl.starter.service.ExampleService;
import javafx.scene.chart.ValueAxis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author panghl
 * @Date 2022/2/10
 * @Description ExampleAutoConfigure
 *
 *
 * @Conditional(TestCondition.class)
 * 这句代码可以标注在类上面，表示该类下面的所有@Bean都会启用配置，也可以标注在方法上面，只是对该方法启用配置。
 * @ConditionalOnBean（仅仅在当前上下文中存在某个对象时，才会实例化一个Bean）
 * @ConditionalOnClass（某个class位于类路径上，才会实例化一个Bean）
 * @ConditionalOnExpression（当表达式为true的时候，才会实例化一个Bean）
 * @ConditionalOnMissingBean（仅仅在当前上下文中不存在某个对象时，才会实例化一个Bean）
 * @ConditionalOnMissingClass（某个class类路径上不存在的时候，才会实例化一个Bean）
 * @ConditionalOnNotWebApplication（不是web应用）
 * @ConditionalOnProperty实现是通过havingValue与配置文件中的值对比,返回为true则配置类生效,反之失效.
 *
 **/
@Configuration
@ConditionalOnClass(value = ExampleService.class) //类路径上下文
@EnableConfigurationProperties(value = ExampleServiceProperties.class) //将ExampleServiceProperties 作为bean的形式注入
public class ExampleAutoConfigure {

    private final ExampleServiceProperties serviceProperties;

    @Autowired
    public ExampleAutoConfigure(ExampleServiceProperties serviceProperties) {
        this.serviceProperties = serviceProperties;
    }

    @Bean
    @ConditionalOnMissingBean(value = ExampleService.class)
    @ConditionalOnProperty(prefix = "example.service",name = "enabled",havingValue = "true")
    public ExampleService exampleService(){
        return new ExampleService(serviceProperties.getPrefix(),serviceProperties.getSuffix());
    }

}
